package com.wongsi.spring5.controller;


import com.wongsi.spring5.entity.Order;
import com.wongsi.spring5.repository.JpaOrderRepository;
import com.wongsi.spring5.repository.OrderRepository;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

//@RestController
//@RequestMapping(path = "/orders", produces = "application/json")
//@CrossOrigin(origins = "*")
public class OrderController {
    @Resource
    private JpaOrderRepository repo;

    /**
     * <h2>用@PutMapping和@PatchMapping来更新数据。</h2>
     */

    /**
     * GET请求用来从服务端往客户端传输数据，
     * PUT请求则是从客户端往服务端发送数据。
     * 从这个意义上讲，PUT真正的目的是执行大规模的替换（replacement）操作，而不是更新操作。
     *
     * 这种方式可以运行，但是它可能需要客户端将完整的订单数据从PUT请求中提交上来。
     * 从语义上讲，PUT意味着“将数据放到这个URL上”，其本质上就是替换已有的数据。
     * 如果省略了订单上的某个属性，那么该属性的值应该被null所覆盖，甚至订单中的taco也需要和订单数据一起设置，否则，它们将会从订单中移除。
     */
    @PutMapping("/{orderId}")
    public Order putOrder(@RequestBody Order order) {
        return repo.save(order);
    }

    /**
     * HTTP PATCH的目的是对资源数据打补丁或局部更新。
     */
    @PatchMapping(path="/{orderId}", consumes="application/json")
    public Order patchOrder(@PathVariable("orderId") Long orderId,
                            @RequestBody Order patch) {
        Order order = repo.findById(orderId).get();
        if (patch.getDeliveryName() != null) {
            order.setDeliveryName(patch.getDeliveryName());
        }
        if (patch.getDeliveryStreet() != null) {
            order.setDeliveryStreet(patch.getDeliveryStreet());
        }
        if (patch.getDeliveryCity() != null) {
            order.setDeliveryCity(patch.getDeliveryCity());
        }
        if (patch.getDeliveryState() != null) {
            order.setDeliveryState(patch.getDeliveryState());
        }
        if (patch.getDeliveryZip() != null) {
            order.setDeliveryZip(patch.getDeliveryState());
        }
        if (patch.getCcNumber() != null) {
            order.setCcNumber(patch.getCcNumber());
        }
        if (patch.getCcExpiration() != null) {
            order.setCcExpiration(patch.getCcExpiration());
        }
        if (patch.getCcCVV() != null) {
            order.setCcCVV(patch.getCcCVV());
        }
        return repo.save(order);
    }

    /**
     * @ResponseStatus注解，以确保响应的HTTP状态码为204（NO CONTENT）。
     * 对于已经不存在的资源，我们没有必要返回任何的资源数据给客户端，
     * 因此DELETE请求通常并没有响应体，
     * 我们需要以HTTP状态码的形式让客户端知道不要期望得到任何的内容。
     */
    @DeleteMapping("/{orderId}")
    @ResponseStatus(code= HttpStatus.NO_CONTENT)
    public void deleteOrder(@PathVariable("orderId") Long orderId) {
        try {
            repo.deleteById(orderId);
        } catch (EmptyResultDataAccessException e) {}
    }

}
